home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1996 February
/
EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso
/
earcd
/
comm2
/
termsorc.lha
/
Extras
/
Source
/
gtlayout-source.lha
/
LT_LockWindow.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-09-24
|
3KB
|
180 lines
/* GadTools layout toolkit
**
** Copyright © 1993-1995 by Olaf `Olsen' Barthel
** Freely distributable.
*/
#include "gtlayout_global.h"
VOID LIBENT
LT_LockWindow(REG(a0) struct Window *window)
{
if(window)
{
LockNode *lockNode;
BOOLEAN found;
found = FALSE;
ObtainSemaphore(<P_LockSemaphore);
SCANLIST(<P_LockList,lockNode)
{
if(lockNode -> Window == window)
{
lockNode -> Count++;
found = TRUE;
break;
}
}
if(!found)
{
if(lockNode = AllocMem(sizeof(LockNode),MEMF_PUBLIC | MEMF_ANY | MEMF_CLEAR))
{
AddTail((struct List *)<P_LockList,(struct Node *)lockNode);
lockNode -> Window = window;
lockNode -> OldIDCMPFlags = window -> IDCMPFlags;
lockNode -> Count = 1;
lockNode -> MinWidth = window -> MinWidth;
lockNode -> MaxWidth = window -> MaxWidth;
lockNode -> MinHeight = window -> MinHeight;
lockNode -> MaxHeight = window -> MaxHeight;
WindowLimits(window,window -> Width,window -> Height,window -> Width,window -> Height);
ModifyIDCMP(window,(window -> IDCMPFlags & IDCMP_REFRESHWINDOW) | IDCMP_SIZEVERIFY);
if(V39)
{
STATIC struct TagItem tags[3] =
{
WA_BusyPointer, TRUE,
WA_PointerDelay, TRUE,
TAG_DONE
};
SetWindowPointerA(window,tags);
}
else
{
STATIC UWORD __chip Stopwatch[(2 + 16) * 2] =
{
0x0000,0x0000,
0x0400,0x07C0,
0x0000,0x07C0,
0x0100,0x0380,
0x0000,0x07E0,
0x07C0,0x1FF8,
0x1FF0,0x3FEC,
0x3FF8,0x7FDE,
0x3FF8,0x7FBE,
0x7FFC,0xFF7F,
0x7EFC,0xFFFF,
0x7FFC,0xFFFF,
0x3FF8,0x7FFE,
0x3FF8,0x7FFE,
0x1FF0,0x3FFC,
0x07C0,0x1FF8,
0x0000,0x07E0,
0x0000,0x0000
};
SetPointer(window,Stopwatch,16,16,-6,0);
}
Request(&lockNode -> Requester,window);
}
}
ReleaseSemaphore(<P_LockSemaphore);
}
}
/****************************************************************************/
VOID LIBENT
LT_UnlockWindow(REG(a0) struct Window *window)
{
if(window)
{
LockNode *lockNode;
ObtainSemaphore(<P_LockSemaphore);
SCANLIST(<P_LockList,lockNode)
{
if(lockNode -> Window == window)
{
if(--lockNode -> Count < 1)
{
Remove((struct Node *)lockNode);
WindowLimits(window,lockNode -> MinWidth,lockNode -> MinHeight,lockNode -> MaxWidth,lockNode -> MaxHeight);
EndRequest(&lockNode -> Requester,window);
if(V39)
SetWindowPointerA(window,NULL);
else
ClearPointer(window);
ModifyIDCMP(window,lockNode -> OldIDCMPFlags);
FreeMem(lockNode,sizeof(LockNode));
}
break;
}
}
ReleaseSemaphore(<P_LockSemaphore);
}
}
/*****************************************************************************/
VOID LIBENT
LT_DeleteWindowLock(REG(a0) struct Window *window)
{
if(window)
{
LockNode *lockNode;
ObtainSemaphore(<P_LockSemaphore);
SCANLIST(<P_LockList,lockNode)
{
if(lockNode -> Window == window)
{
Remove((struct Node *)lockNode);
EndRequest(&lockNode -> Requester,window);
if(V39)
SetWindowPointerA(window,NULL);
else
ClearPointer(window);
ModifyIDCMP(window,lockNode -> OldIDCMPFlags);
FreeMem(lockNode,sizeof(LockNode));
break;
}
}
ReleaseSemaphore(<P_LockSemaphore);
}
}